Use case: UART TX in interrupt mode

Sequence diagram

UART transmit in interrupt mode

@startuml
participant " Application" as p1
participant "HAL UART driver" as p2
participant "UARTX_IRQHandler" as p3

== initialization and configuration ==
== UART HAL Transmit IT ==

p1->p2: <color: green> HAL_UART_Transmit_IT(&huart, aTxBuffer, DATA_TO_SEND_SIZE)
note over p2 #00FF00
Transmitting data ongoing
end note
p2-->p1: HAL_OK
p3<-: UARTX data interrupt
p3->p2: HAL_UART_IRQHandler
note over p2 #FFFF99
All data (Size == huart->TxXferCount) have been transmitted
end note
note over p2 #00FF00
End of transmitting data
end note
p2->p1: HAL_UART_TxCpltCallback(huart->TxXferCount)

@enduml

Code snippet

HAL1

HAL2

#define DATA_TO_SEND_SIZE       256

uint8_t aTxBuffer[DATA_TO_SEND_SIZE] = " **** UART Communication **** ";

UART_HandleTypeDef huart;


/* Ensure that all required peripherals
  (USART, GPIO,NVIC etc.) are configured properly
/*
...
*/

/* UART register Transmit complete user callback */
HAL_UART_RegisterCallback(&huart, HAL_UART_TX_CB_ID,
                          UART_TxCpltCallback);

/* Start a UART Process in interruption mode */
HAL_UART_Transmit_IT(&huart, aTxBuffer,
                        DATA_TO_SEND_SIZE)
#define DATA_TO_SEND_SIZE       256

uint8_t aTxBuffer[DATA_TO_SEND_SIZE] = " **** UART Communication **** ";

hal_uart_handle_t huart;

    /* Ensure that all required peripherals
      (USART, GPIO,NVIC etc.) are configured properly
    /*
    ...
    */

    /* UART register Transmit complete user callback */
    HAL_UART_RegisterTxCpltCallback(&huart, UART_TxCpltCallback);


    /* Start a UART Process in interruption mode */
   HAL_UART_Transmit_IT(&huart, aTxBuffer,
                            DATA_TO_SEND_SIZE)

Key changes

  1. HAL2 provides a dedicated registration API for TX completion callbacks: HAL_UART_RegisterTxCpltCallback()..